#pragma once
namespace soy {

/**
 */
class ContractionState {
	// These contain 1 element for every document line.
	RunStyles* visible;
	RunStyles* expanded;
	RunStyles* heights;
	Partitioning* displayLines;
	int linesInDocument;

	void EnsureData();

	bool OneToOne() const {
		// True when each document line is exactly one display line so need for
		// complex data structures.
		return visible == 0;
	}

public:
	ContractionState();
	virtual ~ContractionState();

	void Clear();

	int LinesInDoc() const;
	int LinesDisplayed() const;
	int DisplayFromDoc( int lineDoc ) const;
	int DocFromDisplay( int lineDisplay ) const;

	void InsertLine( int lineDoc );
	void InsertLines( int lineDoc, int lineCount );
	void DeleteLine( int lineDoc );
	void DeleteLines( int lineDoc, int lineCount );

	bool GetVisible( int lineDoc ) const;
	bool SetVisible( int lineDocStart, int lineDocEnd, bool visible );
	bool HiddenLines() const;

	bool GetExpanded( int lineDoc ) const;
	bool SetExpanded( int lineDoc, bool expanded );
	int ContractedNext( int lineDocStart ) const;

	int GetHeight( int lineDoc ) const;
	bool SetHeight( int lineDoc, int height );

	void ShowAll();
	void Check() const;
};

};
